home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-04-07 | 7.5 KB | 330 lines | [TEXT/MPS ] |
- //----------------------------------------------------------------------------------------
- //UFailure.cp
- //Copyright © 1985-1992 Apple Computer, Inc. All rights reserved.
- //----------------------------------------------------------------------------------------
-
- #ifndef __UFAILURE__
- #include "UFailure.h"
- #endif
-
- #ifndef __STDIO__
- #include <StdIo.h>
- #endif
-
- #ifndef __MEMORY__
- #include <Memory.h>
- #endif
-
- #ifndef __RESOURCES__
- #include <Resources.h>
- #endif
-
- #ifndef __ERRORS__
- #include <Errors.h>
- #endif
-
- #ifdef NEVER
- #ifndef __UMACAPPUTILITIES__
- #include "UMacAppUtilities.h"
- #endif
-
- #ifndef __UDEBUG__
- #include "UDebug.h"
- #endif
- #endif NEVER
-
- FailInfoPtr gTopHandler = NULL;
-
- #if qDebug
- #ifdef NEVER
- MAName pWho; // used serially. Avoids putting it on stack
- #endif
- #endif
-
- extern pascal void DoFailure(FailInfoPtr pf);
-
- //----------------------------------------------------------------------------------------
- // Assertion:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void Assertion(const Boolean condition,
- const CStr255&
- #if qDebug
- description
- #endif
- )
- {
- if (!condition)
- {
- #if qDebug
- #ifdef NEVER
- GetCallersMethodName(pWho);
- fprintf(stderr, "Assertion failed in " + pWho + ": " + description);
- #else
- CStr255 str = "Assertion failed: " + description;
- DebugStr(str);
- #endif
- #endif
- Failure(minErr, 0);
- }
- } // Assertion
-
- //----------------------------------------------------------------------------------------
- // EachFailureHandlerDo:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void EachFailureHandlerDo(DoToHandlerType DoToHandler,
- void* staticLink)
- {
- for (FailInfoPtr pf = gTopHandler; (pf); pf = pf->nextInfo)
- (*DoToHandler)(pf, staticLink);
- } // EachFailureHandlerDo
-
- //----------------------------------------------------------------------------------------
- // FailMemError:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void FailMemError()
- {
- OSErr e = MemError();
-
- if (e != noErr)
- Failure(e, 0);
- } // FailMemError
-
- //----------------------------------------------------------------------------------------
- // FailNewMessage:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void FailNewMessage(short error,
- long oldMessage,
- long newMessage)
- {
- if (!oldMessage)
- Failure(error, newMessage);
- else
- Failure(error, oldMessage);
- } // FailNewMessage
-
- //----------------------------------------------------------------------------------------
- // FailNIL:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void FailNIL(void* p)
- {
- if (!p)
- Failure(memFullErr, 0);
- } // FailNIL
-
- //----------------------------------------------------------------------------------------
- // FailNILResource:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void FailNILResource(Handle r)
- {
- OSErr e;
-
- if (!r)
- {
- e = ResError();
- if (e == noErr)
- e = resNotFound;
- Failure(e, 0);
- }
- } // FailNILResource
-
- //----------------------------------------------------------------------------------------
- // FailOSErr:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void FailOSErr(short error)
- {
- if (error != noErr)
- Failure(error, 0);
- } // FailOSErr
-
- //----------------------------------------------------------------------------------------
- // FailResError:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void FailResError()
-
- {
- OSErr e = ResError();
-
- if (e != noErr)
- Failure(e, 0);
- } // FailResError
-
- //----------------------------------------------------------------------------------------
- // Failure:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void Failure(short error,
- long message)
-
- {
- FailInfoPtr pf = gTopHandler;
- #if qDebug
- #ifdef NEVER
- long pc;
- #endif
- #endif
-
- if (pf)
- {
- // pop the stack first, because calling the handler is likely to result in a call
- // to Failure
- gTopHandler = pf->nextInfo;
-
- #if qDebug
- pf->installed = FALSE;
- #ifdef NEVER
- if (CanWriteLn() && ((error != 0) || gIntenseDebugging))// only show 0 errors if _really_ looking
- {
- GetCallersMethodName(pWho);
- fprintf(stderr, "Failure signaled by: %s\n", (char *) pWho);
- pc = pf->whoPC;
- GetMethodName((void *) pc, pWho);
-
- fprintf(stderr, "Failure caught by: %s\n", (char *) pWho);
- fprintf(stderr, " error: %1d message: %1d (%1d/%1d)\n", error, message, message >> 16, message & 0x0000FFFF);
- }
- #else
- char str[255];
- sprintf(str, "Failure params: error = %d, message = %d", error, message);
- DebugStr(CStr255(str));
- #endif
- #endif qDebug
-
- pf->error = error;
- pf->message = message;
- DoFailure(pf); // Go execute the failure handler
- }
- else
- {
- if (qDebug)
- ProgramBreak("Failure called, but no handler!");
- }
- } // Failure
-
- //----------------------------------------------------------------------------------------
- // ProgramBreak:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void ProgramBreak(const CStr255& grievance)
- {
- CStr255 report = grievance + "\n";
-
- #if qDebug
- #ifdef NEVER
- ConfirmHighLevelDebugger();
-
- if (gHighLevelDebuggerRunning)
- SysBreakStr(report);
- else
- #endif
- DebugStr(report);
- #else
- DebugStr(report);
- #endif
-
- } // ProgramBreak
-
- //----------------------------------------------------------------------------------------
- // ProgramReport:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void ProgramReport(const CStr255& grievance,
- const Boolean
- #if qDebug
- #ifdef NEVER
- breakInDebugger
- #endif
- #endif
- )
-
- {
- CStr255 report = grievance + "\n";
-
- #if qDebug
- #ifdef NEVER
- ConfirmHighLevelDebugger();
-
- if (gHighLevelDebuggerRunning)
- {
- if (breakInDebugger)
- SysBreakStr(report);
- else
- SysBreakFunc(report);
- }
- else
- #endif
- DebugStr(report);
- #else
- DebugStr(report);
- #endif
-
- } // ProgramReport
-
- //----------------------------------------------------------------------------------------
- // HandlerExists:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal Boolean HandlerExists(FailInfoPtr testFailInfoPtr)
- {
- FailInfoPtr pf = gTopHandler;
-
- while (pf)
- {
- if (pf == testFailInfoPtr)
- return TRUE;
- pf = pf->nextInfo;
- }
- return FALSE;
- } // HandlerExists
-
- //----------------------------------------------------------------------------------------
- // Success:
- //----------------------------------------------------------------------------------------
- #pragma segment MAFailureRes
-
- pascal void Success(FailInfo& fi)
- {
- #if qDebug
- if (gTopHandler != &fi)
- {
- CStr255 msg;
- #ifdef NEVER
- fprintf(stderr, "gTopHandler: %p, parameter: %p\n", gTopHandler, &fi);
- #endif
- msg = "Problem with Success: ";
- if (HandlerExists(&fi))
- msg += "too few ";
- else
- msg += "too many ";
- msg += "calls to Success";
- ProgramBreak(msg);
- }
-
- fi.installed = FALSE;
- #endif
-
- gTopHandler = fi.nextInfo;
- } // Success
-
-
-
-